shell tips

heredoc中でescape

# 単純に実行結果をredirectしてるのでescapeする必要がある
cat <<EOF > escape_heredoc.sh
echo \`whoami\` home is \$HOME
EOF

cat escape_heredoc.sh
echo `whoami` home is $HOME

一時的に環境変数を変更

echo $LANG         # ja_JP.UTF-8
       date        # 土  3 25 16:20:03 JST 2017
LANG=C date        # Sat Mar 25 16:20:18 JST 2017
echo $LANG         # ja_JP.UTF-8

LANG=C echo $LANG  # ja_JP.UTF-8 ?? builtin ??
echo 'echo $LANG' > test.sh && chmod +x test.sh

       ./test.sh   # ja_JP.UTF-8
LANG=C ./test.sh   # C

gzip sample

gzip -V
gzip 1.6

gzip -dk data.gz # data
gzip -dc data.gz > data.tsv

gzip -k data.tsv # data.tsv.gz
gzip -c data.tsv > data.gz

gzip -l data.gz
       compressed        uncompressed  ratio uncompressed_name
          2250139            14046126  84.0% data

oneliner: get-pip and install

# http://stackoverflow.com/questions/11369964/run-a-python-script-from-url-in-terminal

echo "import sys;print sys.version" | python
2.7.11+ (default, Apr 17 2016, 14:00:29)
[GCC 5.3.1 20160413]

# つまり下記で良い
wget -q -O- https://bootstrap.pypa.io/get-pip.py | python

# python でpip install, replから抜けたくない時などに
python -c "import pip; pip.main(['install', 'joblib'])"

日付時刻指定してファイル作成

# ファイル作成と、作成済みファイルの日時変更は覚えていたので、調べてみた

touch
usage:
touch [-A [-][[hh]mm]SS] [-acfhm] [-r file] [-t [[CC]YY]MMDDhhmm[.SS]] file ...

man touch

touch f1
touch -t "200012090123.45" f2
touch -t "202001010123.45" f3

あるファイルより新しい時刻のファイルの検索

# 日付時刻指定してファイル作成で分かりやすくファイルを作成した後に
find . -newer f1
./f3

wget with header

# and basic authorization
wget http://localhost:8080 \
    --header='field: value' \
    --header='field2: value2' \
    '--http-user=id' '--http-password=pass'

curl basic auth

curl --user id:pass \
     -X POST \
     -d name=value
     "http://localhost:8080/"

bash の dollar と mkdir and cd

# https://www.gnu.org/software/bash/manual/html_node/Variable-Index.html

mkdir -p foo/bar && cd $_
# 直近のパラメータになるのでちょうどいい

普段awkしか使わないのでcut のメモ

echo "1  2  3" | cut -d" " -f1,2,5
1  3
# delimiterの連続は考慮しない

echo "1  2  3" | awk       '{print $1 $2 $5}'
12
echo "1  2  3" | awk -F' ' '{print $1 $2 $5}'
12

bashで桁の大きい数値文字列の作成

# 今回は20桁
# 10^18になるとオーバーフロー
# seqだけでも0埋め可能

DIGIT_18=$((10 ** 17))
FORMAT='No.%s\n'
for i in $(seq -w 1 1 30)
do
  num=${DIGIT_18}$i
  printf "${FORMAT}" $num
done

expectを使った自動パスワード入力でのssh接続

#!/usr/bin/expect

set timeout 5
spawn ssh [lindex $argv 0]
expect "password:"
send "password\n"
send exit\n
interact
#!/bin/sh

expect -c "
 set timeout 5
 spawn ssh [lindex $argv 0]
 expect "password:"
 send "password\n"
 send exit\n
 interact